// api/site_api/enter.go
// =============================================================================
// | 包: site_api                                                            |
// | 模块: 站点API                                                           |
// | 功能: 提供站点相关的API接口，包括站点信息查看和更新                     |
// | 版本: 1.0.0                                                             |
// =============================================================================
package site_api

import (
	"blog_server/common/res" // 枚举模型包 - 提供系统中使用的枚举类型
	"blog_server/global"
	"blog_server/middleware"

	// 日志服务包 - 提供日志记录功能
	"fmt" // 格式化包 - 用于字符串格式化和输出

	"github.com/gin-gonic/gin" // Web框架 - 提供HTTP路由和处理功能
	// 日志库 - 提供结构化日志记录功能
)

// =============================================================================
// | 结构体: SiteApi                                                         |
// | 功能: 封装站点相关的API方法，便于统一管理和调用                         |
// | 说明: 该结构体作为站点API的入口点，包含所有与站点相关的HTTP处理方法      |
// =============================================================================
type SiteApi struct {
}

// =============================================================================
// | 结构体: SiteInfoRequest                                                  |
// | 功能: 定义站点信息查看请求的数据结构                                     |
// | 说明: 用于绑定URI路径参数，获取要查看的站点配置名称                     |
// |----------------------------------------------------------------------------|
// | 字段: Name - string - 配置名称，通过uri标签映射到路径参数                |
// =============================================================================
type SiteInfoRequest struct {
	Name string `uri:"name"` // 配置名称，用于指定要查询的配置类型
}

// =============================================================================
// | 函数: SiteInfoView                                                      |
// | 接收者: SiteApi (站点API结构体)                                          |
// | 参数: @c - *gin.Context - Gin框架上下文对象，封装HTTP请求和响应          |
// | 功能: 处理GET /site/:name请求，返回站点配置信息                         |
// | 说明: 根据请求的配置名称返回对应配置，site配置无需权限，其他配置需管理员权限 |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 绑定URI参数到结构体                                                   |
// | 2. 如果是site配置，直接返回公开站点信息                                  |
// | 3. 其他配置需验证管理员权限                                              |
// | 4. 根据配置名称返回对应的配置数据                                        |
// =============================================================================
func (SiteApi) SiteInfoView(c *gin.Context) {
	// 声明请求结构体实例
	var cr SiteInfoRequest
	// 绑定URI参数到结构体
	err := c.ShouldBindUri(&cr)
	if err != nil {
		// 参数绑定失败时返回错误响应
		res.FailWithError(err, c)
		return
	}

	// 判断是否为站点公开信息
	if cr.Name == "site" {
		// 返回站点配置信息
		res.OkWithData(global.Config.Site, c)
		return
	}

	// 非公开配置需要管理员权限验证
	middleware.AdminMiddleware(c)
	// 检查权限验证结果
	_, ok := c.Get("claims")
	if !ok {
		// 无权限时直接返回
		return
	}

	// 定义返回数据变量
	var data any

	// 根据配置名称获取对应配置
	switch cr.Name {
	case "email":
		data = global.Config.Email
	case "qq":
		data = global.Config.QQ
	case "qiNiu":
		data = global.Config.QiNiu
	case "ai":
		data = global.Config.Ai
	default:
		// 配置名称不存在时返回错误
		res.FailWithMsg("不存在的配置", c)
		return
	}
	// 返回配置数据
	res.OkWithData(data, c)
	return
}

// =============================================================================
// | 函数: SiteInfoView                                                      |
// | 接收者: SiteApi (站点API结构体)                                          |
// | 参数: @c - *gin.Context (Gin框架的上下文对象，封装了HTTP请求和响应信息)  |
// | 功能: 处理GET /site/info请求，返回站点基本信息                          |
// | 说明: 该接口用于获取站点的公开信息，同时记录登录相关的日志信息          |
// |----------------------------------------------------------------------------|
// | 处理流程:                                                               |
// | 1. 输出调试信息"1"到控制台                                              |
// | 2. 记录一次用户密码登录成功的日志                                       |
// | 3. 记录一次用户密码登录失败的日志(用于测试)                             |
// | 4. 返回包含状态码和消息的JSON响应                                       |
// |----------------------------------------------------------------------------|
// | 返回格式:                                                               |
// | {                                                                       |
// |   "code": 0,           // 状态码，0表示成功                             |
// |   "msg": "站点信息"     // 响应消息                                     |
// | }                                                                       |
// =============================================================================
// func (SiteApi) SiteInfoView(c *gin.Context) {
// 	fmt.Println("1") // 打印调试信息"1"到控制台，用于确认接口被调用

// 记录一次用户使用密码方式登录成功的日志
// 参数: c(Gin上下文), enum.UserPwdLoginType(密码登录类型)
// log_service.NewLoginSuccess(c, enum.UserPwdLoginType)

// 记录一次用户使用密码方式登录失败的日志(测试用)
// 参数: c(Gin上下文), enum.UserPwdLoginType(密码登录类型), "登录失败"(错误信息),
//       "root"(用户名), "root"(密码)
// log_service.NewLoginFail(c, enum.UserPwdLoginType, "登录失败", "root", "root")

// 构造并返回JSON格式的响应数据
// 状态码200表示HTTP请求成功
// gin.H是gin框架提供的简写方式，等价于map[string]interface{}
// c.JSON(200, gin.H{
// 	"code": 0,      // 业务状态码，0表示成功
// 	"msg":  "站点信息", // 响应消息
// })
// return // 显式返回，结束函数执行
// }

// =============================================================================
// | 结构体: SiteUpdateRequest                                               |
// | 功能: 定义站点更新请求的数据结构                                        |
// | 说明: 用于绑定和验证客户端发送的JSON格式请求体                          |
// |----------------------------------------------------------------------------|
// | 字段说明:                                                               |
// | Name: 站点名称，必填字段，通过json标签映射到"name"键                     |
// | Age:  年龄，必填字段，通过json标签映射到"age"键，label标签用于验证提示   |
// =============================================================================
type SiteUpdateRequest struct {
	// 站点名称字段
	// json标签: 指定在JSON中对应的键名为"name"
	// binding标签: required表示该字段为必填项
	Name string `json:"name" binding:"required"`

	// 年龄字段
	// json标签: 指定在JSON中对应的键名为"age"
	// binding标签: required表示该字段为必填项
	// label标签: 用于验证错误时的字段描述"年龄"
	Age int `json:"age" binding:"required" label:"年龄"`
}

// =============================================================================
// | 函数: SiteUpdateView                                                    |
// | 接收者: SiteApi (站点API结构体)                                          |
// | 参数: @c - *gin.Context - Gin框架上下文对象，封装HTTP请求和响应          |
// | 功能: 处理PUT /site请求，用于更新站点配置信息                           |
// | 说明: 该接口用于管理员更新站点配置，需要管理员权限，接收JSON格式请求体   |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 声明请求结构体实例                                                   |
// | 2. 绑定请求体JSON数据到结构体并验证                                     |
// | 3. 参数验证失败时返回错误响应                                           |
// | 4. 验证成功后输出调试信息                                               |
// =============================================================================
func (SiteApi) SiteUpdateView(c *gin.Context) {
	// 声明请求结构体实例，用于接收和验证请求数据
	var cr SiteUpdateRequest

	// 绑定请求体JSON数据到结构体并进行自动验证
	err := c.ShouldBindJSON(&cr)

	// 检查绑定和验证过程中是否出现错误
	if err != nil {
		// 验证失败时返回标准格式的错误响应
		res.FailWithError(err, c)
		return
	}

	// 输出解析和验证成功后的数据到控制台(调试用途)
	fmt.Println(cr)

	// TODO: 此处应添加实际的配置更新业务逻辑
	// 例如更新数据库中的配置信息等

	return
}
